﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenSource.UPnP;
using System.Collections;

namespace DispositifAffichage
{
    class ClientDispositifAffichage2
    {

        private UPnPDevice root2;
        private UPnPService list;
        private UPnPSmartControlPoint cp1;
        GenerateInterface2 generateInterface2;
        private int nb_dev1;
        string methode;

        /**
    * \ClientDispositifAffichage2    le constructeur de la class
    * \param    generateInterface : instance de la class GenerateInterface2.
    */
        public ClientDispositifAffichage2(GenerateInterface2 generateInterface)
        {

            nb_dev1 = 0;
            generateInterface2 = generateInterface;
            root2 = UPnPDevice.CreateRootDevice(360, 1.0, "");
            root2.FriendlyName = "ClientSurfaceServeur2";
            root2.DeviceURN = "urn:schemas-upnp-org:device:ClientSurfaceServeur2:1";
            root2.HasPresentation = false;
            root2.Manufacturer = "sbai";
            root2.ModelName = "UPnP sample for kids";
            root2.UniqueDeviceName = "12345678-153f-430d-82f3-dff320c17502";

            list = new UPnPService(1.0, "Sample2", "urn:schemas-upnp-org:service:Sample2:1", true, this);

            root2.AddService(list);
            root2.Advertise();
        }

        

        /**
        * \Search               méthode intermédiaire dans la recherche d'un device sur le réseau
        */
        public void Search(string meth)
        {
            methode = meth;

            cp1 = new UPnPSmartControlPoint(new UPnPSmartControlPoint.DeviceHandler(NewDevice));
            
            cp1.OnRemovedDevice += new UPnPSmartControlPoint.DeviceHandler(DeviceQuit);

            cp1.Rescan();
        }

        /**
        * \NewDevice                pour la recherche d'un device sur le réseau.
         * \param    sender1        sender1 pour le sender qui a declencher la methode.
        * \param    device          device est le device qui va apparaitre sur réseau.
         */
        public void NewDevice(UPnPSmartControlPoint sender1, UPnPDevice device)
        {

            Console.WriteLine("le nom du dispositif à appeler est : " + generateInterface2.Nameupnp);

            Console.WriteLine("la methode à invoquer est : " + methode);

            if (device.FriendlyName != generateInterface2.Nameupnp)
            {
                Console.Out.WriteLine("ignoring " + device.FriendlyName);

                return;
            }


            Console.WriteLine("on a trouvé le serveur " + generateInterface2.Nameupnp);
            UPnPArgument[] args = new UPnPArgument[1];

            UPnPService serv = device.GetService("SampleClient");

            if (serv == null)
            {

                Console.Error.WriteLine("Could not find service `SampleClient' in device " + nb_dev1);

                return;
            }

            Console.WriteLine("on a trouvé le service SampleClient");

            args[0] = new UPnPArgument("meth", methode);

            string retval = (string)serv.InvokeSync("getresultat2", args);

            if (retval != null) {
                    
           Console.WriteLine("valeuuuuuuuuuuuuuuurrrrrrrrrrrrrrrrr de retval est : "+retval);
            }

            string[] retval2 = new string[3];

            retval2 = retval.Split(',');
            Console.WriteLine("les éléments de retval2 sont ");

            for (int o = 0; o < retval2.Count();o++ ) {

                Console.WriteLine(retval2[o]);
            }

           generateInterface2.changeresultat(retval2[1], retval2[2], retval2[3]);

        }


        /**
        * \DeviceQuit               affiche un message si un device a quitté le réseau
        * \param    sender1         sender1 pour le sender qui a déclenché la méthode.
        * \param    device          device est le device qui va quitter le réseau.
        */
        public void DeviceQuit(UPnPSmartControlPoint sender1, UPnPDevice device)
        {

            Console.Out.WriteLine(generateInterface2.Nameupnp + " quit: " + nb_dev1);
            nb_dev1--;

        }

        /**
        * \startUPnP       pour démarrer le device

        */
        public void startUPnP()
        {
            root2.StartDevice();
        }

        /**
        * \stopUPnP       pour arrêter le device

        */
        public void stopUPnP()
        {
            root2.StopDevice();
        }

    }
}
